package com.nowcoder.topic.string.middle;

import java.util.HashMap;

/**
 * NC340 阿拉伯数字转中文
 * @author d3y1
 */
public class NC340{
    private HashMap<Integer, String> numMap = new HashMap<Integer, String>(){{
        put(0, "零");
        put(1, "一");
        put(2, "二");
        put(3, "三");
        put(4, "四");
        put(5, "五");
        put(6, "六");
        put(7, "七");
        put(8, "八");
        put(9, "九");
    }};

    private HashMap<Integer, String> map = new HashMap<Integer, String>(){{
        put(0, "");
        put(1, "十");
        put(2, "百");
        put(3, "千");
        put(4, "万");
        put(5, "亿");
    }};

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return string字符串
     */
    public String num2cn (int n) {
        if(n == 0){
            return "零";
        }
        String numStr = String.valueOf(n);
        StringBuilder result = new StringBuilder();

        boolean isNegative = false;
        if(numStr.startsWith("-")){
            isNegative = true;
            if(numStr.length() > 1){
                numStr = numStr.substring(1);
            }
        }

        // 按4位分隔处理
        int len = numStr.length();
        int parts = (int)Math.ceil(len/4.0);

        int start, end;
        String partResult = "";
        String partNum;
        for(int i=0; i<parts; i++){
            start = len-(i+1)*4;
            if(start < 0){
                start = 0;
            }
            end = len-i*4;
            partNum = numStr.substring(start, end);
            if(partNum.equals("0000")){
                continue;
            }
            partResult = partNum2CN(partNum);
            if(i > 0){
                partResult += map.get(i+3);
            }
            result.insert(0, partResult);
        }

        if(isNegative){
            result.insert(0, "负");
        }

        return result.toString();
    }

    private String partNum2CN(String numStr){
        StringBuilder sb = new StringBuilder();

        // 从左到右 第一个非零索引 first non-zero index
        int FNZIndex = -1;
        // 从右到左 第一个非零索引 last non-zero index
        int LNZIndex = -1;
        if(numStr.length() > 0){
            for(int i=0; i<numStr.length(); i++){
                if(numStr.charAt(i) != '0'){
                    FNZIndex = i;
                    break;
                }
            }
            if(FNZIndex == -1){
                return "";
            }
            for(int i=numStr.length()-1; i>=0; i--){
                if(numStr.charAt(i) != '0'){
                    LNZIndex = i;
                    break;
                }
            }

            char ch;
            boolean hasZero = false;
            int len = numStr.length();
            for(int i=0; i<len; i++){
                ch = numStr.charAt(i);
                if(ch == '0'){
                    if(FNZIndex<i && i<LNZIndex && !hasZero){
                        sb.append("零");
                        hasZero = true;
                    }
                    if(i<FNZIndex && !hasZero){
                        sb.append("零");
                        hasZero = true;
                    }
                }else{
                    // 十位为一的情况 1011->一千零十一 1000000000->十亿
                    if(ch=='1' && len-1-i==1){
                        if(i > 0){
                            if(numStr.charAt(i-1)=='0'){
                                sb.append(map.get(len-1-i));
                            }else{
                                sb.append(numMap.get(ch-'0')).append(map.get(len-1-i));
                            }
                        }
                        else{
                            sb.append(map.get(len-1-i));
                        }
                    }else{
                        sb.append(numMap.get(ch-'0')).append(map.get(len-1-i));
                    }

                }
            }
        }

        return sb.toString();
    }
}
